package Thread;

/*
 * 当静态方法被synchronized声明时
 * */
public class synchronizedDemo3 {
    public static void main(String[] args) {
        Boo b1 = new Boo();
        Boo b2 = new Boo();
        Thread t1 = new Thread() {
            @Override
            public void run() {
                b1.dosome();
            }
        };
        Thread t2 = new Thread() {
            @Override
            public void run() {
                b2.dosome();
            }
        };

        t1.start();
        t2.start();
    }
}

class Boo {
    /*
     * 因为静态方法 是在类被首次加载时同时加载在方法区中 只有一份，不管通过什么方法调用静态方法 都是调用的一个内存地址
     * 所以synchronized关键字自动将this作为同步监视器，此处的dosome方法被锁上后不管是不是同实例都不可以同时使用dosome方法
     * 其实就是因为静态资源是全局共享的
     * 如果该方法是成员方法的话就可以通过不同的两个不同的实例来执行
     * */
    public synchronized static void dosome() {

        /*
         * 如果想要在静态方法中使用同步块 同步监视器也指定为类对象就好
         * 类对象是全局唯一的，类对象的获取就是 类名.class
         * */
        //synchronized (Boo.class){}
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + ":正在执行dosome方法");
            Thread.sleep(5000);
            System.out.println(t.getName() + ":执行dosome方法完毕!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
